﻿using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace C_高级编程
{
    internal class 泛型集合
    {
        /// <summary>
        /// Stack栈
        /// </summary>
        public void test()
        { 
            //栈Stack是先进后出的数据接口，如同枪的弹匣
            //先进后出
            Stack<int>  stack = new Stack<int>();
            stack.Push(1);//压如元素(添加)
            stack.Push(2);
            stack.Push(3);

            int b= stack.Peek();//读取最后一个压入的元素（不移除）
            int a=stack.Peek();//读取底部元素
            Console.WriteLine(a);//显示：3
            Console.WriteLine(b);//显示：3

            int c = stack.Pop();//移除并返回最后一个压入的元素
            Console.WriteLine(c);//显示3
            Console.WriteLine(stack.Count);//显示:2

            int d = stack.Pop();//移除并返回最后一个压入的元素
            Console.WriteLine(d);//显示：2
            Console.WriteLine(stack.Count);//显示：1

            int result;

            bool ww = stack.TryPop(out result);//正常则把移除的元素赋值给result,ww为true，

        }



        /// <summary>
        /// 队列 queue
        /// </summary>
        public void test2()
        { 
            Queue<int> queue = new Queue<int>(4);//初始化长度为4的队列
            queue.Enqueue(1);//入队
            queue.Enqueue(2);
            queue.Enqueue(3);
            queue.Enqueue(4);

            int a = queue.Peek();//读取最先入队的元素(不移除)
            queue.Peek();

            //遍历队列
            //与Peak()一样，不过是循环的Peak，从最先入队的开始
            foreach (var item in queue)
            {
                Console.WriteLine(item);
            }

            var b = queue.Dequeue();//出队，移除元素，并返回元素的值

        }

        /// <summary>
        /// SortedList排序集合
        /// </summary>
        public void test3()
        {
            //SortedList<T key,K value>
            //科目：string 成绩：int
            SortedList<string, int> list = new SortedList<string, int>();

            //第一种赋值方式
            list["英语"] = 90;
            list["语文"] = 100;
            list["地理"] = 90;

            //第二种赋值方式
            list.Add("生物", 100);

            //sortedList是根据Key来排序的，中文根据键的拼音排序，英文根据字母，数字根据大小
            foreach (var item in list)
            {
                Console.WriteLine($"科目:{item.Key}，成绩:{item.Value}");
            }

        }

        [Test]
        /// <summary>
        /// SortedList练习
        /// </summary>
        public void exercise()
        {
            //创建一个键值对类型都是string 的泛型排序集合
                SortedList<string, string> list = new SortedList<string, string>();
            //初始化一些没有重复键的元素，但对应的值有些元素是重复的
                list["英语"] = "100";
                list["语文"] = "100";
                list["数学"] = "50";
                list["物理"] = "80";
                list.Add("体育","100");
            //如果添加一个重复的键会报异常(键不能重复)
                list.Add("英语","111");
            //这样写等于修改
                list.Add("英语","1111");
            //元素的键可以作为集合索引来访问元素
                Console.WriteLine(list["英语"]);
            //如果请求的键不存在，则会抛异常
                try
                {
                    string a = list["化学"].ToString();
                }
                catch (Exception ex) 
                {
                    Console.WriteLine(ex.Message);
                }
            //当程序经常要尝试获取的键，却不在集合中，TryGetvalue()是个更有效获取值的方法；
            string result;
            bool ww = list.TryGetValue("化学", out result);//如键存在，返回true，把值输出到result,如键不存在，

            //判断是否包含键
                if (list.ContainsKey("化学"))
                { 
            
                }

                //遍历排序集合
                foreach (var item in list) 
                {
                    Console.WriteLine($"键:{item.Key},值：{item.Value}");
                }

            //获取所有的键
                var keys = list.Keys;
                foreach (var key in keys)
                {

                Console.WriteLine(key);
                }
        }
    }
}
